import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;


public class DBcontroller {
	Connection conn;
	Statement st;
	
	DBcontroller() {
		
		try {
			Class.forName("org.postgresql.Driver").newInstance();
		} catch (Exception e) {
		}

		try {
			// Abre conexao com o servidor de bancos de dados
			conn = DriverManager.getConnection(
					"jdbc:postgresql://localhost/mc436", "root", "root");
			st = conn.createStatement();
		} catch (SQLException e) {
			System.err.println("Nao foi possivel obter conexao com banco!");
			e.printStackTrace();
		}

	}
	
	private ResultSet executeQuery(String arg) {
		
	ResultSet rs;
	try {

        rs = st.executeQuery(arg);
	} catch (Exception e) {
		e.printStackTrace();
		System.err.println("Erro login!");
		return null;
	}
	return rs;
	}
	
	private boolean execute(String arg) {
		
		try {

			Statement st = conn.createStatement();
	        st.execute(arg);
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
		
	public boolean Cadastrar(String login, String pass, String tipo, String nome, String rg, String cpf, 
			String endereco, String telefone, String email, int dia, int mes, int ano, String sexo) {
		
		return execute("INSERT INTO usuarios(login, password, tipo, nome, rg, cpf, endereco, telefone, email, dia, mes, ano, sexo)" +
						"VALUES ('"+login+"','"+pass+"','"+tipo+"','"+nome+"','"+rg+"','"+cpf+
						"','"+endereco+"','"+telefone+"','"+email+"',"+dia+","+mes+","+ano+",'"+sexo+"')");
	}
	
	public boolean ChangePass(String oldpass, String newpass, String usuario) {
		return execute("UPDATE usuarios SET password='"+newpass+"' WHERE password='"+oldpass+"' AND login='"+usuario+"';");
	}
	
	public String Login(String usuario, String senha) {
			String tipo = null;
			try {
				ResultSet rs = executeQuery("SELECT tipo FROM usuarios WHERE login='"+usuario+"' AND password='"+senha+"';");
				while (rs.next()) {
						tipo = rs.getString("tipo");
				}
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}


		return tipo;
	}
	
	public ArrayList<String> getListUsuarios(String tipoarg) {
		ArrayList<String> lista = new ArrayList<String>();
		String tipo = "WHERE tipo='"+tipoarg+"';";
		if(tipoarg==null) {
			tipo = ";";
		}
		try {
			ResultSet rs = executeQuery("select login from usuarios "+tipo);
			while (rs.next()) {
				lista.add(rs.getString("login"));
			}
			rs.close();
		} catch(Exception e) {
			e.printStackTrace();
		}

		return lista;
	}
	
	public ArrayList<String> getListTrabalhos(String usuario) {
		ArrayList<String> lista = new ArrayList<String>();
		try {
			ResultSet rs = null;
			if(usuario == null) {
			rs = executeQuery("SELECT titulo FROM trabalhos");
			} else {
			rs = executeQuery("SELECT titulo FROM trabalhos_associados WHERE avaliador='"+usuario+"';");	
			}
			while (rs.next()) {
				lista.add(rs.getString("titulo"));
			}

			rs.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return lista;
	}	
	
	public File getFile(String trabalho) {
		File file = null;
		
		try {
			ResultSet rs = executeQuery("SELECT filepath FROM trabalhos WHERE titulo='"+trabalho+"';");
			String filepath = null;
			while (rs.next()) {
				 filepath = rs.getString("filepath");
			}
			file = new File(filepath);

			rs.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return file;
	}
	
	public boolean setAvaliacao(String trabalho, String avaliador, int nota, String comentario) {
		
        return execute("update trabalhos_associados set nota="+nota+", comentario='"+comentario+"' where titulo='"+trabalho+"' and avaliador='"+avaliador+"';");
	}
	
	public boolean setNivel(String usuario, String nivel) {

		return execute("update usuarios set tipo='"+nivel+"' where login='"+usuario+"';");
	}
	
	public boolean setAssocTrabalho(String usuario, String trabalho) {

	    return execute("insert into trabalhos_associados(titulo, avaliador) values ('"+trabalho+"','"+usuario+"');");

	}
	
	public boolean setFile(String usuario, String titulo, String filepath) {
	
		if(!execute("INSERT INTO trabalhos(usuario, titulo, filepath) VALUES ('"+usuario+"','"+titulo+"','"+filepath+"')")) {
			return execute("UPDATE trabalhos SET titulo='"+titulo+"', filepath='"+filepath+"' WHERE usuario='"+usuario+"'");
		}
		return true;
	}
	
}
